package com.uade.empresasdistribuidas.model;

import java.util.List;

import com.uade.empresasdistribuidas.connection.HibernateUtil;
import com.uade.empresasdistribuidas.dao.VehiculoDAO;
import com.uade.empresasdistribuidas.dao.VehiculoDAOImpl;
import com.uade.empresasdistribuidas.entities.SucursalDTO;
import com.uade.empresasdistribuidas.entities.VehiculoDTO;

public class Vehiculo {

	private static VehiculoDAO vehiculoDAO;
	private VehiculoDTO vehiculo;
	public static final String EN_SUCURSAL="EN_SUCURSAL";
	public static final String EN_TRANSITO = "EN_TRANSITO";
	
	public Vehiculo(VehiculoDTO vehiculoDTO) {
		vehiculo=vehiculoDTO;
	}


	public Vehiculo(Integer nroVehiculo) {
		vehiculo=getVehiculoDAO().findById(nroVehiculo);
	}


	public static Vehiculo obtenerVehiculoLibre(String sucursalNombreInicio,
			Float peso, String localidadOrigen, boolean refrigeracion) {
		List<VehiculoDTO> vehiculos =getVehiculoDAO().findVehiculosActivosEnSucursal(sucursalNombreInicio,refrigeracion,peso);
		Vehiculo response=null;
		if (vehiculos!=null && vehiculos.size()>0){
			response=new Vehiculo(vehiculos.get(0));
			return response;
		}	else	{
			vehiculos=getVehiculoDAO().findVehiculosLibresEnCiudad(localidadOrigen,refrigeracion,peso);
			if (vehiculos!=null && vehiculos.size()>0){
				response=new Vehiculo(vehiculos.get(0));
				return response;
			}else{
				VehiculoDTO example= new VehiculoDTO();
				example.setLibre(true);
				if (refrigeracion) example.setRefrigerado(refrigeracion);
				vehiculos=getVehiculoDAO().findByExample(example);
				example=obtenerVehiculoCorrecto(vehiculos,peso);
				if (example!=null){
					return new Vehiculo(example);
				}	else{
					return null;
				}
			}
		}
	}

	
	private static VehiculoDTO obtenerVehiculoCorrecto(List<VehiculoDTO> vehiculos,Float peso) {
		for (VehiculoDTO vehiculo:vehiculos){
			if (vehiculo.entraPeso(peso)){
				return vehiculo;
			}
		}
		return null;
	}


	public static VehiculoDAO getVehiculoDAO(){
		if (vehiculoDAO==null){
			vehiculoDAO=new VehiculoDAOImpl();
			vehiculoDAO.setSession((HibernateUtil.getSession()));
		}
		
		return vehiculoDAO;
	}


	public VehiculoDTO getVehiculo() {
		return vehiculo;
	}


	public void setVehiculo(VehiculoDTO vehiculo) {
		this.vehiculo = vehiculo;
	}


	public void asignarVehiculo() {
		vehiculo.setLibre(false);
		getVehiculoDAO().makePersistent(vehiculo);
		
	}


	public void cambiarEstado(String string) {
		vehiculo.setEstado(Vehiculo.EN_TRANSITO);
		vehiculo.setSucursal(null);
		getVehiculoDAO().makePersistent(vehiculo);
	}


	public void llegadaVehiculo(SucursalDTO sucursal) {
		vehiculo.setSucursal(sucursal);
		vehiculo.setEstado(Vehiculo.EN_SUCURSAL);
		getVehiculoDAO().makePersistent(vehiculo);
		
	}


	public void entregarEnvio(float kilometros) {
		vehiculo.setLibre(true);
		vehiculo.setKmRecorridos(vehiculo.getKmRecorridos() + kilometros);
		getVehiculoDAO().makePersistent(vehiculo);
	}
}

